<?php

define("TOKEN", "ruixiang");

//实例化对象
$wechatObj = new wechatCallbackapiTest();

//调用函数
if (isset($_GET['echostr'])) {
  $wechatObj->valid();
} else {
  $wechatObj->responseMsg();
};


class wechatCallbackapiTest
{
  public function valid()
  {
    $echoStr = $_GET["echostr"];
    if ($this->checkSignature()) {
      echo $echoStr;
      exit;
    } else {
      exit;
    }
  }

  public function responseMsg()
  {

    if (isset($GLOBALS['HTTP_RAW_POST_DATA'])) {
      $postStr = $GLOBALS['HTTP_RAW_POST_DATA'];
    } else {
      $postStr = file_get_contents('php://input');
    }
    if (empty($postStr))
      exit("");

    if (!empty($postStr)) {
      //libxml_disable_entity_loader(true);//安全防护
      $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
      $fromUsername = $postObj->FromUserName;
      $toUsername = $postObj->ToUserName;
      $time = time();
      //trim() 函数移除字符串两侧的空白字符或其他预定义字符。
      $keyword = trim($postObj->Content);
      $msgtype = 'text'; //消息类型：文本
      //文本消息
      $postText = "<xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[%s]]></MsgType>
                <Content><![CDATA[%s]]></Content>
                </xml>";
      //图文消息
      $postImgTxt = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <ArticleCount><![CDATA[%s]]></ArticleCount>
                            <Articles>
                                <item>
                                    <Title><![CDATA[%s]]></Title>
                                    <Description><![CDATA[%s]]></Description>
                                    <PicUrl><![CDATA[%s]]></PicUrl>
                                    <Url><![CDATA[%s]]></Url>
                                </item>
                            </Articles>
                            </xml>";
      //点击菜单拉取消息时的事件推送
      /*
       * 1、click：点击推事件
       * 用户点击click类型按钮后，微信服务器会通过消息接口推送消息类型为event的结构给开发者（参考消息接口指南）
       * 并且带上按钮中开发者填写的key值，开发者可以通过自定义的key值与用户进行交互；
       */
      if ($postObj->MsgType == 'event' && $postObj->Event == 'CLICK') {
        $keyword = trim($postObj->EventKey);
        if ($keyword == 'home') {
          $resultStr = sprintf($postImgTxt, $fromUsername, $toUsername, $time, 'news', '1',
              '欢迎关注孝感瑞祥房产代理有限公司', '诚信服务 专业代理 精心为您提供所需房源！专业为您推荐新房 二手房 等各种房源。只要你来,包您满意！联系电话：18971966446'
              , 'https://img.alicdn.com/bao/uploaded/i4/859494695/TB1v1tSJxWYBuNjy1zkXXXGGpXa_!!0-item_pic.jpg', 'http://www.linqinghu.cn/ruixiang/index.html');
          exit($resultStr);
        }
        if ($keyword == 'phonenumber') {
          $contentStr = '林经理 18971966446';
          $resultStr = sprintf($postText, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
          echo $resultStr;
          exit();
        }
      }

      /*系统关注,回复*/
      if ($postObj->MsgType == 'event') {
        if ($postObj->Event == 'subscribe') { //如果是订阅事件
//          $contentStr = 'welcome you  哈哈 哈哈哈';
//          $resultStr1 = sprintf($postText, $fromUsername, $toUsername, $time, $msgtype, $contentStr);

          $resultStr2 = sprintf($postImgTxt, $fromUsername, $toUsername, $time, 'news', '1',
              '欢迎关注孝感瑞祥房产代理有限公司', '诚信服务 专业代理 精心为您提供所需房源！专业为您推荐新房 二手房 等各种房源。只要你来,包您满意！联系电话：18971966446'
              , 'https://www.linqinghu.cn/images/indexBanner3.jpg', 'http://www.linqinghu.cn/ruixiang/index.html');
          echo $resultStr2;
//          echo $resultStr2;
          exit();
        }
      }

      if ($postObj->MsgType == 'text') {
        $contentStr = '';
        switch ($keyword) {
          case '1':
            $contentStr = '111111111111111111111111';
            break;
          case '2':
            $contentStr = '2222222222222222222222222222';
            break;
          case '3':
            $contentStr = '333333333333333333333333';
            break;
          default:
            $contentStr = "该关键词还没有收录词库。请从菜单获取信息\n\n" . date("Y-m-d H:i:s", time()) . "\n林庆虎";
            break;
        }
        $resultStr = sprintf($postText, $fromUsername, $toUsername, $time, $msgtype, $contentStr);
        echo $resultStr;
        exit();
      }

//      if ($msgType == 'text') {
//        $textTpl = "<xml>
//                        <ToUserName><![CDATA[%s]]></ToUserName>
//                        <FromUserName><![CDATA[%s]]></FromUserName>
//                        <CreateTime>%s</CreateTime>
//                        <MsgType><![CDATA[text]]></MsgType>
//                        <Content><![CDATA[%s]]></Content>
//                        <FuncFlag>0</FuncFlag>
//                        </xml>";
//        $contentStr = "您发的是消息包含以下信息：\n发信人OpenID：" . $fromUsername . "\n收信人微信号：" . $toUsername . "\n发信时间：" . $createTime . "\n消息类型：" . $msgType . "\n消息内容：" . $content . "\n消息ID：" . $msgId;
//        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr);
//        echo $resultStr;
//      } else {
//        $textTpl = "<xml>
//                        <ToUserName><![CDATA[%s]]></ToUserName>
//                        <FromUserName><![CDATA[%s]]></FromUserName>
//                        <CreateTime>%s</CreateTime>
//                        <MsgType><![CDATA[text]]></MsgType>
//                        <Content><![CDATA[%s]]></Content>
//                        <FuncFlag>0</FuncFlag>
//                        </xml>";
//        $contentStr = "您发的消息类型不是文本。而是" . $msgType;
//        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr);
//        echo $resultStr;
//      }
    }
  }

  private function checkSignature()
  {
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];
    $token = TOKEN;
    $tmpArr = array($token, $timestamp, $nonce);
    sort($tmpArr, SORT_STRING);
    $tmpStr = implode($tmpArr);
    $tmpStr = sha1($tmpStr);

    if ($tmpStr == $signature) {
      return true;
    } else {
      return false;
    }
  }
}
